.TH std::has_virtual_destructor 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::has_virtual_destructor \- std::has_virtual_destructor

.SH Synopsis
   Defined in header <type_traits>
   template< class T >              \fI(since C++11)\fP
   struct has_virtual_destructor;

   std::has_virtual_destructor is a UnaryTypeTrait.

   If T is a type with a virtual destructor, the base characteristic is std::true_type.
   For any other type, the base characteristic is std::false_type.

   If T is an incomplete non-union class type, the behavior is undefined.

   If the program adds specializations for std::has_virtual_destructor or
   std::has_virtual_destructor_v, the behavior is undefined.

.SH Template parameters

   T - a type to check

   Helper variable template

   template< class T >
   inline constexpr bool has_virtual_destructor_v =                       \fI(since C++17)\fP
   has_virtual_destructor<T>::value;



Inherited from std::integral_constant

.SH Member constants

   value    true if T has a virtual destructor, false otherwise
   \fB[static]\fP \fI(public static member constant)\fP

.SH Member functions

   operator bool converts the object to bool, returns value
                 \fI(public member function)\fP
   operator()    returns value
   \fI(C++14)\fP       \fI(public member function)\fP

.SH Member types

   Type       Definition
   value_type bool
   type       std::integral_constant<bool, value>

.SH Notes

   If a class C has a public virtual destructor, it can be derived from, and the
   derived object can be safely deleted through a pointer to the base object (GotW
   #18). In this case, std::is_polymorphic<C>::value is true.

.SH Example


// Run this code

 #include <type_traits>

 struct S {};
 static_assert(!std::has_virtual_destructor_v<S>);

 struct B { virtual ~B() {} };
 static_assert(std::has_virtual_destructor_v<B>);

 struct D : B { ~D() {} };
 static_assert(std::has_virtual_destructor_v<D>);

 int main()
 {
     B* pd = new D;
     delete pd;
 }

   Defect reports

   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.

      DR    Applied to     Behavior as published           Correct behavior
   LWG 2015 C++11      the behavior was undefined if the base characteristic is
                       T is an incomplete union type std::false_type in this case

.SH See also

   is_destructible
   is_trivially_destructible
   is_nothrow_destructible   checks if a type has a non-deleted destructor
   \fI(C++11)\fP                   \fI(class template)\fP
   \fI(C++11)\fP
   \fI(C++11)\fP
   is_polymorphic            checks if a type is a polymorphic class type
   \fI(C++11)\fP                   \fI(class template)\fP
